import { defineConfig, loadEnv } from "vite";
import vue2 from "@vitejs/plugin-vue2";
import path from "path";
import { createSvgIconsPlugin } from "vite-plugin-svg-icons";
import sitemap from "vite-plugin-sitemap";
import axios from "axios";
import compression from "vite-plugin-compression";
import { visualizer } from "rollup-plugin-visualizer";
import { createHtmlPlugin } from "vite-plugin-html";
import { VueMcp } from "vite-plugin-vue-mcp";

// 动态路由获取函数 -- 动态路由 - 用于生成 sitemap.xml 文件，用于搜索引擎索引SEO优化
async function getDynamicRoutes(command) {
  // 仅在生产构建时获取动态路由
  if (command !== "build") {
    return [];
  }

  const apiBaseUrl = "https://blog.kingcola-icg.cn/ynga";
  let allArticleRoutes = [];
  let allAlbumRoutes = [];

  try {
    // --- 1. 获取所有文章（处理分页 - 逻辑已根据项目代码验证） ---
    console.log("✅ 开始获取文章列表用于生成 sitemap (已适配项目分页逻辑)...");
    let currentPage = 1;
    let totalPages = 1; // 先假设总页数为1
    const pageSize = 50; // 每次请求50条以提高效率

    do {
      const { data: articleResponse } = await axios.get(
        `${apiBaseUrl}/api/article/list`,
        {
          params: {
            pageNum: currentPage, // 使用 'pageNum' 作为分页参数
            pageSize: pageSize, // 使用 'pageSize' 作为分页参数
          },
        }
      );

      const articles = articleResponse?.data?.records; // 数据在 .data.records 中
      if (articles && Array.isArray(articles) && articles.length > 0) {
        const articleRoutes = articles.map((article) => `/post/${article.id}`);
        allArticleRoutes.push(...articleRoutes);

        // 从API响应中计算总页数
        const totalRecords = articleResponse?.data?.total;
        if (totalRecords) {
          totalPages = Math.ceil(totalRecords / pageSize);
        }

        console.log(`已获取第 ${currentPage}/${totalPages} 页文章...`);
        currentPage++;
      } else {
        // 如果某一页没有数据，则认为已获取完毕
        console.log(
          `在第 ${currentPage} 页未获取到更多文章，认为已是最后一页。`
        );
        break;
      }
    } while (currentPage <= totalPages);
    console.log(`✅ 文章列表获取完毕，共 ${allArticleRoutes.length} 条路由。`);

    // --- 2. 获取所有相册 (逻辑已根据项目代码验证) ---
    console.log("✅ 开始获取相册列表用于生成 sitemap...");
    const { data: albumResponse } = await axios.get(
      `${apiBaseUrl}/api/album/list`
    );

    // 相册数据直接在 .data 中
    const albums = albumResponse?.data;
    if (albums && Array.isArray(albums)) {
      allAlbumRoutes = albums.map((album) => `/photos/${album.id}`);
    } else {
      console.warn(
        "警告: 未获取到有效的相册数据，或响应格式不符。",
        albumResponse
      );
    }
    console.log(`✅ 相册列表获取完毕，共 ${allAlbumRoutes.length} 条路由。`);

    const allRoutes = [...allArticleRoutes, ...allAlbumRoutes];
    if (allRoutes.length === 0) {
      console.warn(
        "‼️ 警告: 未能获取到任何动态路由，生成的 sitemap 将不包含任何文章和相册!"
      );
    }
    return allRoutes;
  } catch (error) {
    console.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");
    console.error("!!! 获取动态路由时发生严重错误，Sitemap 生成失败 !!!");
    if (error.response) {
      console.error(`!!! HTTP 状态码: ${error.response.status}`);
      console.error(
        "!!! 响应数据:",
        JSON.stringify(error.response.data, null, 2)
      );
    } else {
      console.error("!!! 错误消息:", error.message);
    }
    console.error("!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!");

    // 在CI/CD等自动化环境中，遇到错误时应终止构建
    if (process.env.CI) {
      process.exit(1);
    } else {
      // 在本地开发环境中，允许构建继续，但会发出严重警告
      console.warn(
        "构建将继续，但 sitemap 会非常不完整。请检查您的网络连接、API服务是否正常以及API路径是否正确。"
      );
      return []; // 返回空数组，允许构建继续进行
    }
  }
}

export default defineConfig(async ({ command, mode }) => {
  const env = loadEnv(mode, process.cwd());
  const dynamicRoutes = await getDynamicRoutes(command);

  return {
    server: {
      base: "/",
      // 允许IP访问
      host: "0.0.0.0",
      // 应用端口 (默认:3000)
      port: Number(env.VITE_APP_PORT),
      // 运行是否自动打开浏览器
      open: true,
      proxy: {
        /** 代理前缀为 /dev-api 的请求  */
        [env.VITE_APP_BASE_API]: {
          changeOrigin: true,
          // 接口地址
          target: env.VITE_APP_API_URL,
          rewrite: (path) =>
            path.replace(new RegExp("^" + env.VITE_APP_BASE_API), ""),
        },
        /** 代理 音乐接口 -- 只能在本地开发时使用，生产环境需要使用后端代理，因此生产和开发环境都改成后端代理实现 */
        // "/music-api": {
        //   target: "你的网易云音乐接口地址",
        //   changeOrigin: true,
        //   rewrite: (path) => path.replace(/^\/music-api/, ""),
        // },
        /** 代理 t.alcy.cc 的图片接口 -- 只能在本地开发时使用，生产环境需要使用后端代理，因此生产和开发环境都改成后端代理实现 */
        // "/image-api": {
        //   target: "https://t.alcy.cc",
        //   changeOrigin: true,
        //   rewrite: (path) => path.replace(/^\/image-api/, ""),
        //   followRedirects: true,
        // },
      },
    },
    plugins: [
      vue2(),
      createHtmlPlugin({
        minify: true,
        /**
         * 在这里生成一个不带 hash 的 index.html 作为入口
         * 这个文件会立即重定向到带 hash 的 index.html
         * 这是解决顽固缓存问题的终极方案
         */
        // 通过 Nginx 配置确保 index.html 不被缓存，
        // 并为带有哈希值的静态资源（js, css）设置长期缓存，
        // 这是解决 SPA 缓存问题的最佳实践。
        template: "index.html",
        inject: {
          data: {
            // 注入一个版本号，可以在 meta 标签中看到
            version: new Date().toISOString(),
          },
        },
      }),
      visualizer({
        open: true, // 在默认浏览器中打开生成的文件
        filename: "stats.html", // 生成的文件名
        gzipSize: true, // 显示 gzip 后的大小
        brotliSize: true, // 显示 brotli 后的大小
      }),
      compression({
        verbose: true, // 是否在控制台输出压缩结果
        disable: false, // 是否禁用
        threshold: 10240, // 文件大小大于这个值时才进行压缩 (in bytes)
        algorithm: "gzip", // 压缩算法
        ext: ".gz", // 压缩后的文件扩展名
      }),
      compression({
        verbose: true,
        disable: false,
        threshold: 10240,
        algorithm: "brotliCompress",
        ext: ".br",
      }),
      sitemap({
        hostname: "https://blog.kingcola-icg.cn",
        dynamicRoutes: dynamicRoutes,
        robots: [
          {
            userAgent: "*",
            allow: "/",
          },
        ],
      }),
      [VueMcp()],
      createSvgIconsPlugin({
        // 指定需要缓存的图标文件夹
        iconDirs: [path.resolve(process.cwd(), "src/assets/icons")],
        // 指定symbolId格式
        symbolId: "icon-[dir]-[name]",
      }),
    ],
    // 新增 esbuild 配置，用于在生产环境中移除 console 和 debugger
    // esbuild: {
    //   drop: command === "build" ? ["console", "debugger"] : [],
    // },
    resolve: {
      alias: {
        "@": path.resolve(__dirname, "./src"),
      },
    },
    css: {
      preprocessorOptions: {
        scss: {
          api: "modern-compiler",
          additionalData: `
                  @use "@/styles/variables.scss" as *;
                  @use "@/styles/mixins.scss" as *;
                  @use "@/styles/global.scss" as *;
                  @use "@/styles/elmentui.scss" as *;
                `,
        },
      },
    },
  };
});
